package com.linkgie.galaxyframework.security;

import java.util.Set;

import com.linkgie.galaxyframework.organization.Organization;

/**
 * 登录认证主体；
 * <p>
 * 
 * 描述了一次成功的登录认证之后与登录主体相关的信息；
 * 
 * @author huanghaiquan
 *
 */
public interface AuthenticationPrincipal {

	/**
	 * 登录标识；
	 * <p>
	 * 
	 * 登录标识是一个随机数，代表了某个用户的某一次登录；
	 * 
	 * @return
	 */
	long getLoginId();

	/**
	 * 登录凭据名称；
	 * <p>
	 * 返回值与登录方式有关， 例如，以用户名密码登录时，返回的是用户名；
	 * 
	 * @return
	 */
	String getCredentialName();

	/**
	 * 登录的账号；
	 * 
	 * @return
	 */
	AccountPrincipal getAccount();

	/**
	 * 登录的组织；
	 * 
	 * @return
	 */
	OrganizationPrincipal getLoginOrganization();

	/**
	 * 当前登录主体被授权的组织；
	 * <p>
	 * 
	 * 返回结果中包含当前登录的组织（ {@link #getLoginOrganization()} ）；
	 * 
	 * @return
	 */
	Set<Organization> getAuthorizedOrganizations();

	/**
	 * 当前认证中登录的应用；
	 * 
	 * @return
	 */
	OpenApplication getApplication();

	/**
	 * 当前认证中登录的应用用户详情；
	 * <p>
	 * 如果当前认证账号没有应用用户身份，或者不是以应用用户身份登录，则返回 null ；
	 * 
	 * @return
	 */
	OpenUserDetails getOpenUserDetails();

	/**
	 * 设置用户资料；
	 * <p>
	 * 注：此方法仅更新上下文缓存的用户资料，不会更新数据库中的用户资料；
	 * @param userProfile 用户资料；
	 */
	void setUserProfile(UserProfile userProfile);

}
